package com.java.Collection.List;

import java.util.*;

/**
 * List遍历：其子类ArrayList、LinkedList、Vector均适用
 */
public class ListTraverse {
    // for循环遍历
    public static <E> void listFor(List<E> list) {
        for (int i = 0; i < list.size(); i++) {
            E e = list.get(i);
            System.out.print(e + " ");
            
            // 遍历时直接改变对象地址值或改变对象内属性值时原集合内对象都不变
        }
        System.out.println();
    }
    
    // ListIterator正向遍历：ListIterator是Iterator的子类，每一个迭代器对象只能遍历一次，指针不会复位，ListIterator具有更丰富的API
    public static <E> void listIteratorForward(ListIterator<E> listIterator, List<E> list) {
        while (listIterator.hasNext()) { // hasNext：判断下一个指针位置是否有元素
            E e = listIterator.next(); // // next：指针下移并获取下移后指针位置元素，若无元素则抛出异常NoSuchElementException
            System.out.print(e + " ");
            
            // 迭代过程中只能使用迭代器的add/remove添加或移除元素而不能利用集合的add/remove，否则抛出异常ConcurrentModificationException
            // 若使用集合API改变集合，但迭代器无法同步改变，导致迭代器内集合与实际集合不一致，进而抛出并发修改异常
            if ("HJL".equals(e)) {
                // list.remove(str);
                listIterator.remove();
                
                // list.add(str);
                listIterator.add(e);
            }
            
            // 遍历时直接改变对象地址值则原集合内对象不变，改变对象内属性值时则原集合内对象属性改变
        }
        System.out.println();
    }
    
    // ListIterator逆向遍历：逆向遍历必须发生于正向遍历后
    public static <E> void listIteratorReverse(ListIterator<E> listIterator, List<E> list) {
        while (listIterator.hasPrevious()) { // hasPrevious：判断上一个指针位置是否有元素
            E e = listIterator.previous(); // previous：指针上移并获取上移后指针位置元素，若无元素则抛出异常NoSuchElementException
            System.out.print(e + " ");
            
            // 迭代过程中只能使用迭代器的add/remove添加或移除元素而不能利用集合的add/remove，否则抛出异常ConcurrentModificationException
            // 若使用集合API改变集合，但迭代器无法同步改变，导致迭代器内集合与实际集合不一致，进而抛出并发修改异常
            
            // 遍历时直接改变对象地址值则原集合内对象不变，改变对象内属性值时则原集合内对象属性改变
        }
        System.out.println();
    }
    
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>(Arrays.asList("MJQ", "DCX", "SYX", "LYW", "ZZY", "YHX", "HJL"));
        List<String> linkedList = new LinkedList<>(Arrays.asList("MJQ", "DCX", "SYX", "LYW", "ZZY", "YHX", "HJL"));
        
        // for循环遍历
        listFor(arrayList); // MJQ DCX SYX LYW ZZY YHX HJL
        listFor(linkedList); // MJQ DCX SYX LYW ZZY YHX HJL
        
        // ListIterator遍历：ListIterator是Iterator的子类，每一个迭代器对象只能遍历一次，指针不会复位，ListIterator具有更丰富的API
        ListIterator<String> arrayListIterator = arrayList.listIterator();
        listIteratorForward(arrayListIterator, arrayList); // MJQ DCX SYX LYW ZZY YHX HJL
        listIteratorReverse(arrayListIterator, arrayList); // HJL YHX ZZY LYW SYX DCX MJQ
        
        ListIterator<String> linkedListIterator = linkedList.listIterator();
        listIteratorForward(linkedListIterator, linkedList); // MJQ DCX SYX LYW ZZY YHX HJL
        listIteratorReverse(linkedListIterator, linkedList); // HJL YHX ZZY LYW SYX DCX MJQ
        
        System.out.println(arrayList); // [MJQ, DCX, SYX, LYW, ZZY, YHX, HJL]
        System.out.println(linkedList); // [MJQ, DCX, SYX, LYW, ZZY, YHX, HJL]
    }
}
